package javaNIO1.buffer;

import org.checkerframework.checker.units.qual.C;

import java.nio.CharBuffer;

/**
 * Created with Intel IDEA.
 * 复制缓冲区
 * @Auther: gjt
 * @Date: 2024/7/7 13:20
 */
public class copyBuffer {
    private static CharBuffer charBuffer = CharBuffer.allocate(100);
    private static CharBuffer copyBuffer = CharBuffer.allocate(100);
    public static void main(String[] args) {
        charBuffer.put('1');
        charBuffer.put('2');
        charBuffer.put('3');
        charBuffer.put('4');
        charBuffer.put('5');
        charBuffer.put('6');
        copy(charBuffer);
        slice(charBuffer);
    }

    private static void copy(CharBuffer charBuffer){
        System.out.println(charBuffer.position() + "位置；" + charBuffer.limit() + "上界；" + charBuffer.capacity());
        // 复制缓冲区,两个缓冲区共享数据元素拥有同样的容量，但各自的位置，上界和标记不一定一样
        CharBuffer duplicate = charBuffer.duplicate();
        /**
         * 对一个缓冲的改变会反应另一个缓冲区上
         */
        System.out.println(duplicate.position() + "位置；" + duplicate.limit() + "上界；" + duplicate.capacity());

        /**
         *  asReadOnlyBuffer() 生成一个只读的缓冲区视图
         *  如果一个只读缓冲区和一个可以写的缓冲区共享数据，对数组的直接改变 或者可写的缓冲区 都会映射到可读缓冲区
         */

        CharBuffer readOnlyBuffer = charBuffer.asReadOnlyBuffer();

    }

    private static void slice(CharBuffer charBuffer){
        charBuffer.position(2).limit(5);
        // 分割缓冲区 不过这个子缓冲区只会继承只读和直接属性
        CharBuffer slice = charBuffer.slice();
        System.out.println(slice.position() + "位置；" + slice.limit() + "上界；" + slice.capacity());
        while(slice.hasRemaining()){
            System.out.println(slice.get());
        }

    }
}
